jsp+servlet+mysql实现简单登录的完整项目

您所在的位置:网站首页 jsp javabean项目 jsp+servlet+mysql实现简单登录的完整项目

jsp+servlet+mysql实现简单登录的完整项目

2024-07-16 13:55| 来源: 网络整理| 查看: 265

一、分析项目之前要了解下properties文件的使用 在开发项目时,有很多地方会出现重复的代码或者日后可能需要修改的代码,比如:连接数据库、设置项目编码格式、设定文件上传保存目录等等。重复代码或许可以用静态变量来实现全局调用而不必重复出现,但是毕竟是写死在代码里的,日后需要修改时还要修改源码,比较麻烦而且不便于维护。Java给我们提供了Properties类,可以用来解决这些问题。 Properties类以"key=value"形式保存了一系列的配置信息,其中Key与value都是String类型。这样,我们可以把需要重复用的信息,或者日后需要修改的信息以配置的形式从源码中独立出来。修改时只需修改Properties文件,在源码中通过properties类对象来读取信息即可同步到整个项目。下面,介绍一下JavaWeb项目中使用Properties文件使项目配置化。 1、在项目的src目录下新建 .properties 后缀名的文件。 把文件放在src目录下,在部署时会自动部署到classes目录下的。放到别处是获取不到文件的。 注意: Properties文件名首字母不能大写否则也是找不到文件的。 用文本编辑文件或者在IDEA中打开这个配置文件,把项目中可以配置化的信息提取出来,以 key=value 形式书写。注意一行一个。 一般可以配置化的信息有:项目中重复出现的语句,日后需要修改的信息等。比如:数据库驱动、数据库url、数据库名以及密码、项目编码格式、文件上传路径、临时文件保存路径等等。 例如:

url=jdbc:mysql://localhost:3306/login user:root password=ForMe=520 driver=com.mysql.jdbc.Driver

三:在项目中获取配置信息 在properties文件中配置好信息后,在项目中可以通过Properties类对象来读取信息。分四步: 1、新建properties对象 2、创建输入流打开properties文件。 3、properties对象从输入流加载配置信息 4、通过properties.getProperties(“key”)获取具体配置信息 例如:

Properties prop = new Properties(); InputStream in = JdbcUtils.class.getResourceAsStream("/a"); try { prop.load(in); url = prop.getProperty("url"); user = prop.getProperty("user"); password = prop.getProperty("password"); dv = prop.getProperty("driver"); 省略以下非关键代码 }

注意: 1、 InputStream in=当前类 名.class.getClassLoader().getResourceAsStream("config.properties"); 2、InputStream in=当前类名.(如果是Java App,对应src;如果是Java Web App,对应class).getClassLoader().getResourceAsStream("config.properties"); 以上是两种获取InputStream对象的方法,但是创建输入流时,Test.class.getClassLoader().getResourceAsStream()方法直接获得字节输入流,所以不用考虑路径中是否包含中文的问题,如果是通过Test.class.getClassLoader().getResource()方法,因为该方法返回值是URL,如果项目的目录中有中文命名,则获得的URL会出现乱码。

二、分析问题: 1、用到的开发工具:IDEA、Tomcat、mysql-connector-java-5.1.25-bin.jar包 2、项目目录 Fn7GQI.png 3、分析问题 1、首先要有一个用户类(User类) 2、把连接数据库所需要用到的信息存到一个.properties文件中 3、进行数据库注册驱动操作的工具类 (JdbcUtils类) 4、与数据库进行交互的类UserDAo类 5、登录表单 (Login.jsp) 6、注册表单(register.jsp) 7、处理登录后的servlet (LoginServlet类) 8、处理注册后的servlet (RegisterServlet类) 9、登录成功与失败界面 10、配置web.xml

三、具体实现过程如下 1、User类(User.java) 包括id(int)、name(String)、password(String)、role(int) 代码如下:

package com.demo.bean; /** * Created by ForMe * com.demo.bean * 2018/12/1 * 15:25 */ public class User { private String name; private int role; private String password; private Integer id; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getRole() { return role; } public void setRole(int role) { this.role = role; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } }

2、properties文件(a.properties) 在src目录下创建a.properties文件

url=jdbc:mysql://localhost:3306/login user:root password=ForMe=520 driver=com.mysql.jdbc.Driver

3、数据库注册驱动的工具类(JdbcUtils.java) 此类只实现了数据库的注册驱动,并实现了关闭资源的功能。

package com.demo.utils; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; /** * Created by ForMe * com.demo * 2018/12/1 * 15:31 */ public class JdbcUtils { private static String url = null; private static String user = null; private static String password = null; private static String dv = null; static{ Properties prop = new Properties(); InputStream in = JdbcUtils.class.getResourceAsStream("/a");//不能是a.properties,因为在IDEA中文件名字就是a,与eclipse不同 try { //以下四步避免了以后数据库名字等信息改变后来修改源码 prop.load(in); url = prop.getProperty("url"); user = prop.getProperty("user"); password = prop.getProperty("password"); dv = prop.getProperty("driver"); //注册驱动 Class.forName(dv); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getconn() throws SQLException { Connection connection = DriverManager.getConnection(url,user,password); return connection; } public static void close(Statement statement, Connection connection){ if(statement != null) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection != null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void close(PreparedStatement preparedStatement, Connection connection, ResultSet result) { if(preparedStatement != null){ try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection != null){ try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } if(result != null){ try { result.close(); } catch (SQLException e) { e.printStackTrace(); } } } }

4、与数据库进行交互的类(UserDAo.java) 与数据库进行交互,实现了注册(向数据库中插入新的用户User)功能,登录(访问数据库与表格中所填数据比较,若一致则登陆成功,否则登录失败)功能 具体实现代码如下:

package com.demo.dao; import com.demo.bean.User; import com.demo.utils.JdbcUtils; import javax.xml.transform.Result; import java.sql.*; /** * Created by ForMe * com.demo * 2018/12/1 * 15:59 */ public class UserDAo { //数据库连接对象 //此方法用于在数据库中查询信息并与Login.jsp表格中所填信息比较,若数据库中存在 //与表格所填数据一一对应相等,则登陆成功,否则登录失败 public User login(String username, String password){ User u = null; Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { connection = JdbcUtils.getconn(); String sql = "select * from user where name=? and password=?"; preparedStatement = (PreparedStatement)connection.prepareStatement(sql); preparedStatement.setString(1,username); preparedStatement.setString(2,password); resultSet = preparedStatement.executeQuery(); if(resultSet.next()){ u = new User(); u.setName(resultSet.getString("name")); u.setPassword(resultSet.getString("password")); System.out.println("登录成功"); } else{ System.out.println("用户名或者密码错误"); } } catch (SQLException e) { e.printStackTrace(); } finally{ JdbcUtils.close(preparedStatement,connection); } return u; } //此方法实现注册功能,向数据库中写入新用户的信息 public void addUser(User user){ Connection connection = null; PreparedStatement preparedStatement = null; try { connection = JdbcUtils.getconn(); String sql = "insert into user(id,name,password,role)values(?,?,?,?);"; preparedStatement = (PreparedStatement)connection.prepareStatement(sql); preparedStatement.setInt(1,user.getId()); preparedStatement.setString(2,user.getName()); preparedStatement.setString(3,user.getPassword()); preparedStatement.setInt(4,user.getRole()); preparedStatement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }finally{ JdbcUtils.close(preparedStatement,connection); } } }

5、登录表单(Login.jsp) 登录界面的设计还是很简单的,是一个表单,如下:

登录界面 body{ background-position: center; background-repeat: no-repeat; } ForMe的主页 用户登录 用户名: 密码: 注册

6、注册表单(register.jsp) 与登录表单相似,如下所示

注册界面 body{ background-repeat: no-repeat; background-position: center; } 用户注册 ID: 登录名: 密码: 角色: 登录

7、处理Login.jsp的servlet类(LoginServlet) 主要是获取登录表单所填写的用户名和密码,并调用UserDAo类访问数据库中的信息,将二者相比较,若是存在数据库中信息与表单信息相等,则登录成功,否则登录失败,失败或者成功后都将跳转到对应的页面。相对实现较为简单

package com.demo.service; import com.demo.bean.User; import com.demo.dao.UserDAo; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Created by ForMe * ${PACKAGE_NAME} * 2018/12/1 * 15:57 */ @WebServlet(name = "LoginServlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); UserDAo userDAo = new UserDAo(); User user = userDAo.login(username,password); if(user != null){ request.getRequestDispatcher("success.jsp").forward(request,response); } else { request.getRequestDispatcher("defeat.jsp").forward(request,response); } } }

8、处理register.jsp表单的servlet类(RegisterServlet.java) 与处理登录表单数据相似,当注册时,首先要把注册表单的信息获取到,并新建一个User类的对象,是User对象具备注册表单的注册信息,在调用UserDAo类的addlogin(User user)方法向数据库中写入此User对象,完成注册功能。具体实现如下:

package com.demo.service; import com.demo.bean.User; import com.demo.dao.UserDAo; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * Created by ForMe * ${PACKAGE_NAME} * 2018/12/1 * 16:28 */ @WebServlet(name = "RegisterServlet") public class RegisterServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPut(request,response); } // protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // // } protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setCharacterEncoding("UTF-8"); //PrintWriter out = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); int id = Integer.valueOf(request.getParameter("id")); String username = request.getParameter("name"); String password = request.getParameter("password"); int role = Integer.valueOf(request.getParameter("role")); User user = new User(); user.setId(id); user.setName(username); user.setPassword(password); user.setRole(role); UserDAo userDAo = new UserDAo(); userDAo.addUser(user); System.out.println("注册成功"); request.getRequestDispatcher("Login.jsp").forward(request,response); } }

9、简单的登录成功与失败页面 success.jsp

登录成功页面 登录成功

defeat.jsp

登录失败 登录失败 重新登录 注册

10、配置we.xml

LoginServlet com.demo.service.LoginServlet LoginServlet /LoginServlet RegisterServlet com.demo.service.RegisterServlet RegisterServlet /RegisterServlet

访问的时候先访问register.jsp进行注册,注册成功后会跳转到登录界面进行登录。结果如下: Fn70YQ.png Fn76O0.png Fn72wT.png 当登陆失败时,结果如下: Fn7olR.png 各个页面的具体功能等待完善… … 完整的项目保存在github上:ForMe的github



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3